TreeView: Get expander size from CSS min-width|height
authorDaniel Boles <dboles.src@gmail.com>
Wed, 20 Jun 2018 20:11:59 +0000 (21:11 +0100)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Thu, 21 Jun 2018 13:49:00 +0000 (15:49 +0200)
Rather than hard-coding this, get it from CSS. That way, themes will be
able to set larger expanders than a fixed 16 px, e.g. for accessibility.

See https://gitlab.gnome.org/GNOME/gtk/merge_requests/167

gtk/gtktreeview.c
gtk/theme/Adwaita/_common.scss
gtk/theme/Adwaita/gtk-contained-dark.css
gtk/theme/Adwaita/gtk-contained.css
gtk/theme/HighContrast/_common.scss
gtk/theme/HighContrast/gtk-contained-inverse.css
gtk/theme/HighContrast/gtk-contained.css

index f77f60d3a8c86949058e2fa13c13159a67a0e5c5..87bb56ce88a5c314e69acc9ec876ceba88c24be9 100644 (file)
@@ -262,9 +262,7 @@ typedef enum {
 #define TREE_WINDOW_Y_TO_RBTREE_Y(tree_view,y) ((y) + tree_view->priv->dy)
 #define RBTREE_Y_TO_TREE_WINDOW_Y(tree_view,y) ((y) - tree_view->priv->dy)
 
-/* Size of the expander arrow */
-#define _TREE_VIEW_EXPANDER_SIZE 16
-/* Vertical separator width. Must be an eben number. */
+/* Vertical separator width. Must be an even number. */
 #define _TREE_VIEW_VERTICAL_SEPARATOR 2
 /* Horizontal separator width. Must be an even number.  */
 #define _TREE_VIEW_HORIZONTAL_SEPARATOR 4
@@ -2712,7 +2710,26 @@ row_is_separator (GtkTreeView *tree_view,
 static int
 gtk_tree_view_get_expander_size (GtkTreeView *tree_view)
 {
-  return _TREE_VIEW_EXPANDER_SIZE + (_TREE_VIEW_HORIZONTAL_SEPARATOR / 2);
+  GtkStyleContext *context;
+  GtkCssStyle *style;
+  int min_width;
+  int min_height;
+  int expander_size;
+
+  context = gtk_widget_get_style_context (GTK_WIDGET (tree_view));
+  gtk_style_context_save (context);
+  gtk_style_context_add_class (context, GTK_STYLE_CLASS_EXPANDER);
+
+  style = gtk_style_context_lookup_style (context);
+  min_width = _gtk_css_number_value_get
+    (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_MIN_WIDTH), 100);
+  min_height = _gtk_css_number_value_get
+    (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_MIN_HEIGHT), 100);
+
+  gtk_style_context_restore (context);
+
+  expander_size = MAX (min_width, min_height);
+  return expander_size + (_TREE_VIEW_HORIZONTAL_SEPARATOR / 2);
 }
 
 static void
index 52461e078949b5182cfd5c688d84c5e83eea543d..f50f86211e6349880f5e09098256d3fb8eaa887e 100644 (file)
@@ -1783,6 +1783,9 @@ treeview.view {
   }
 
   &.expander {
+    // GtkTreeView uses the larger of the expander’s min-width and min-height
+    min-width: 16px;
+    min-height: 16px;
     -gtk-icon-source: -gtk-icontheme('pan-end-symbolic');
 
     &:dir(rtl) { -gtk-icon-source: -gtk-icontheme('pan-end-symbolic-rtl'); }
index d5222330b1f96c3c94ee921923e59c39e4588cfa..b6493e99595eb87392376ed52040c767b91f5664 100644 (file)
@@ -726,7 +726,7 @@ treeview.view:drop(active).after { border-top-style: none; }
 
 treeview.view:drop(active).before { border-bottom-style: none; }
 
-treeview.view.expander { -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); color: #bdbebf; }
+treeview.view.expander { min-width: 16px; min-height: 16px; -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); color: #bdbebf; }
 
 treeview.view.expander:dir(rtl) { -gtk-icon-source: -gtk-icontheme("pan-end-symbolic-rtl"); }
 
index d99d1b1691d75af978522610182bd7c316fba737..e48eddb01754efca9bfc38ac2f00fd801a1147c3 100644 (file)
@@ -734,7 +734,7 @@ treeview.view:drop(active).after { border-top-style: none; }
 
 treeview.view:drop(active).before { border-bottom-style: none; }
 
-treeview.view.expander { -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); color: #4d4d4d; }
+treeview.view.expander { min-width: 16px; min-height: 16px; -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); color: #4d4d4d; }
 
 treeview.view.expander:dir(rtl) { -gtk-icon-source: -gtk-icontheme("pan-end-symbolic-rtl"); }
 
index 5b7cab92f1ea37bbd12e22264f4af97042b3fe56..58d28c5defcb05d3c278a4b98fc802251d63e8c8 100644 (file)
@@ -1367,6 +1367,9 @@ treeview.view {
   }
 
   &.expander {
+    // GtkTreeView uses the larger of the expander’s min-width and min-height
+    min-width: 16px;
+    min-height: 16px;
     -gtk-icon-source: -gtk-icontheme('pan-end-symbolic');
     &:dir(rtl) { -gtk-icon-source: -gtk-icontheme('pan-end-symbolic-rtl'); }
     color: mix($fg_color, $base_color, 70%);
index 1ac9d8db135bc903022c8a2dfebcdabf391570f2..fd341012fcdd0c22c6810b7db4a98513f204b231 100644 (file)
@@ -572,7 +572,7 @@ treeview.view:backdrop { color: #fff; border-left-color: gray; border-top: #000;
 
 treeview.view.dnd { border-style: solid none; border-width: 1px; border-color: #eeeeee; }
 
-treeview.view.expander { -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); color: #b8b8b8; }
+treeview.view.expander { min-width: 16px; min-height: 16px; -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); color: #b8b8b8; }
 
 treeview.view.expander:dir(rtl) { -gtk-icon-source: -gtk-icontheme("pan-end-symbolic-rtl"); }
 
index 1e6e2e6b4022ea9054989ca4d8ec535c0395da38..14cd0c634112661d5149fa024d21a152b03532dd 100644 (file)
@@ -576,7 +576,7 @@ treeview.view:backdrop { color: #000; border-left-color: gray; border-top: #fff;
 
 treeview.view.dnd { border-style: solid none; border-width: 1px; border-color: black; }
 
-treeview.view.expander { -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); color: #4d4d4d; }
+treeview.view.expander { min-width: 16px; min-height: 16px; -gtk-icon-source: -gtk-icontheme("pan-end-symbolic"); color: #4d4d4d; }
 
 treeview.view.expander:dir(rtl) { -gtk-icon-source: -gtk-icontheme("pan-end-symbolic-rtl"); }